home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
intools.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1985-06-03
|
4KB
|
146 lines
{ INTOOLS - Procedures and Functions for interactive input in Pascal
Copyright (c) 1984 by Ronald Florence
These procedures and functions were written to avoid the horrors of
"Data Format Error in file USER" crashes. The procedures will work
with IBM Pascal or MS-Pascal, and can be incorporately separately as
needed with {$include} metacommands.
RDREAL: reads a real number (positive or negative) in decimal format
RDINT: reads an integer (positive or negative) within a specified range
RDCHAR: reads a character in a specified set (inkey)
NOMORE: prompts the user with 'More?' and reads a 'y' or 'n' (inkey)
YESNO: reads a 'y' or 'n' (inkey)
Use the tools in 'repeat...until' loops. For example:
repeat
write ('Enter an integer between 0 and 10: ');
until rdint(0,10);
Include 'charset = set of char' as a type declaration when using RDCHAR }
function rdreal (var r: real): boolean;
const bell = chr (7);
var decimal, left, right: real;
neg: boolean;
begin
left:= 0;
decimal:= 1;
right:= 0;
neg:= false;
while not eoln and not (input^ in [chr(33)..chr(255)]) do get (input);
neg:= input^ = chr(45);
if neg then get (input);
rdreal:= input^ in ['0'..'9'];
while input^ in ['0'..'9'] do begin;
left:= left * 10 + ord (input^) - ord ('0');
get (input);
end;
if input^ = chr(46) then begin
get (input);
while input^ in ['0'..'9'] do begin
right:= right + decimal * (ord (input^) - ord ('0')) / 10;
decimal:= decimal / 10;
get (input);
end;
end;
r:= left + right;
if neg then r:= - r;
if input^ in [chr(33)..chr(44), chr(47), chr(58)..chr(255)] then begin
rdreal:= false;
write (bell);
end;
readln;
end;
function rdint (var i:integer; low,high:integer): boolean;
const bell = chr (7);
var neg: boolean;
begin
i:= 0;
neg:= false;
while not eoln and not (input^ in [chr(33)..chr(255)]) do get (input);
neg:= input^ = chr(45);
if neg then get (input);
while input^ in ['0'..'9'] do begin
i:= i * 10 + ord (input^) - ord ('0');
get (input);
end;
if neg then i:= - i;
if (input^ in [chr(33)..chr(44), chr(46), chr(47), chr(58)..chr(255)]) or
(eoln and ((i < low) or (i > high))) then begin
rdint:= false;
write (bell);
end
else rdint:= (i >= low) and (i <= high);
readln;
end;
function rdchar (okchars: charset): char;
var f, g: file of char;
c: char;
function inkey: char;
begin
repeat get (f) until f^ <> chr (0);
inkey:= f^;
end;
begin
assign (f, 'user');
reset (f);
assign (g, 'user');
rewrite (g);
repeat
c:= inkey;
if not (c in okchars) then if c in ['A'..'Z'] then
c:= chr (ord(c) - ord('A') + ord('a'))
else if c in ['a'..'z'] then c:= chr (ord(c) - ord('a') + ord('A'));
until c in okchars;
write (g, c);
writeln;
rdchar:= c;
end;
function nomore: boolean;
var f, g: file of char;
c: char;
function inkey: char;
begin
repeat get (f) until f^ <> chr (0);
inkey:= f^;
end;
begin
write ('More? ');
assign (f, 'user');
reset (f);
assign (g, 'user');
rewrite (g);
repeat c:= inkey until c in ['y','Y','n','N'];
write (g, c);
writeln;
nomore:= c in ['n', 'N']
end;
function yes: boolean;
var f, g: file of char;
c: char;
function inkey: char;
begin
repeat get (f) until f^ <> chr (0);
inkey:= f^;
end;
begin
assign (f, 'user');
reset (f);
assign (g, 'user');
rewrite (g);
repeat c:= inkey until c in ['y','Y','n','N'];
write (g,c);
writeln;
yes:= c in ['y', 'Y'];
end;